package com.plian.Tools;

import com.plian.Tools.pagedata.PageData;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class TreeUtli {
    /**
     *不知道父节点时的，形成的树
     * @param orgAll 数据列表
     */
    public List<PageData> NoParentIdtree(List<PageData> orgAll){
            List<PageData> l1=new ArrayList<>();
            l1.addAll(orgAll);
            List<PageData> varList=getParent(l1);
            varList.forEach(pageData -> {
                pageData.put("children",getChlid(pageData.getString("id"),orgAll));
            });
        return varList;
    }

    /**
     *
     *
     * @param All 数据列表
     * @param ParentName    父字段名
     * @param name     子字段名
     * @return
     */
    public List<PageData> NoParentIdtree(List<PageData> All ,String ParentName , String name){
        List<PageData> list=new ArrayList<>();
        list.addAll(All);
        List<PageData> varList = getParent(list,ParentName,name);
        varList.forEach(pageData -> {
            pageData.put("children",getChlid(pageData.getString(name),All,ParentName,name));
        });
        return varList;
    }


    /**
     递归，建立子树形结构，除去id及其子树
     * @param listAll 数据列表
     * @param pid 父id
     * @return
     */
    public List<PageData> getChlid(String pid,List<PageData> listAll,String id) {
        List<PageData> l=new ArrayList<>();
        //得到当前下的子节点
        for (PageData pageData : listAll) {
            if((pageData.getString("parentId").equals(pid))){
                if (!pageData.getString("id").equals(id)){
                    List<PageData> l1=getChlid(pageData.getString("id"),listAll);
                    pageData.put("children",l1);
                    l.add(pageData);
                }
            }
        }
        return  l;
    }
    /**
     递归，建立子树形结构
     * @param listAll 数据列表
     * @param pid 父id
     * @return
     */
    public List<PageData> getChlid(String pid,List<PageData> listAll) {
        List<PageData> l=new ArrayList<>();
        //得到当前下的子节点
        for (PageData pageData : listAll) {
            if(StringUtil.isNotBlank(pageData.getString("parentId"))){
                if(pageData.getString("parentId").equals(pid)){
                    List<PageData> l1=getChlid(pageData.getString("id"),listAll);
                    pageData.put("children",l1);
                    l.add(pageData);
                }
            }
        }
        return  l;
    }

    /**
     递归，建立子树形结构,返回一级所有机构列表
     * @param listAll 数据列表
     * @param pid 父id
     * @return
     */
    public void getChlidNoTree(String pid, List<PageData> listAll, List<PageData> resultList, Map<String,PageData> orgMap) {
        List<PageData> l=new ArrayList<>();
        //得到当前下的子节点
        for (PageData pageData : listAll) {
            if(pageData.getString("parentId").equals(pid)){
                PageData pd=orgMap.get(pid);
                pd.put("isHasChild","1");
                resultList.add(pageData);
                getChlidNoTree(pageData.getString("id"),listAll,resultList,orgMap);
            }
        }
    }

    /**
     递归，建立没有空子树形结构
     * @param listAll 数据列表
     * @param pid 父id
     * @return
     */
    public List<PageData> getNoEmptyChild(String pid,List<PageData> listAll) {
        List<PageData> l=new ArrayList<>();
        //得到当前下的子节点
        for (PageData pageData : listAll) {
            if(pageData.getString("parentId").equals(pid)){
                List<PageData> l1 = getNoEmptyChild(pageData.getString("id"),listAll);
                if (CollectionUtil.isNotEmpty(l1)){
                    pageData.put("children",l1);
                }
                l.add(pageData);
            }
        }
        return  l;
    }
    /**
     递归，建立子树形结构
     * @param listAll 数据列表
     * @param pid 父id
     * @return
     */
    public List<PageData> getChlid1(String pid,List<PageData> listAll) {
        List<PageData> l=new ArrayList<>();
        //得到当前下的子节点
        for (PageData pageData : listAll) {
            if(StringUtil.isNotBlank(pageData.getString("parentId"))){// 20241221 zsk有的数据就是空的 需要判空
                if(pageData.getString("parentId").equals(pid)){
                    List<PageData> l1=getChlid1(pageData.getString("id"),listAll);
                    if(l1.size()>0){
                        pageData.put("children",l1);
                    }
                    l.add(pageData);
                }
            }

        }
        return  l;
    }

    public List<PageData> getChlid(String pid,List<PageData> listAll,String ParentName , String name) {
        List<PageData> l=new ArrayList<>();
        //得到当前下的子节点
        for (PageData pageData : listAll) {
            if(pageData.getString(ParentName).equals(pid)){
                pageData.put("children",getChlid(pageData.getString(name),listAll));
                l.add(pageData);
            }
        }
        return  l;
    }

    /**
     递归，建立子树形结构
     * @param listAll 数据列表
     * @param pid 父id
     * @return
     */
    public List<PageData> getChlidList(String pid,List<PageData> listAll,List<PageData> list) {
        List<PageData> varList=new ArrayList<>();
        if(list==null){
            list=new ArrayList<>();
        }
        for (PageData pageData:listAll) {
            //子集
                List<PageData> l = new ArrayList<>();
                //添加子集
                if(StringUtil.isNotBlank(pageData.getString("parentId"))){//20241223 需要判空
                    if(pageData.getString("parentId").equals(pid)){
                        l.add(pageData);
                    }
                }

               //递归添加子集
                if (l != null && l.size() > 0) {
                    for (PageData data : l) {
                        getChlidList(data.getString("id"),listAll,list);
                        varList.add(data);
                    }
                }
        }
        list.addAll(varList);
        return  list;
    }


    /**
     递归，建立子树形结构
     * @param listAll 数据列表
     * @param pid 父id
     * @param ParentName 父id key
     * @param name id key
     * @return
     */
    public List<PageData> getChlidList(String pid,List<PageData> listAll,List<PageData> list, String ParentName , String name) {
        if(list==null){
            list=new ArrayList<>();
        }
        //子集
        List<PageData> l = new ArrayList<>();
        for (PageData pageData:listAll) {
            //添加子集
            if(StringUtil.isNotBlank(pageData.getString(ParentName))){//20241223需要判空
                if(pageData.getString(ParentName).equals(pid)){
                    l.add(pageData);
                }
            }

        }
        //递归添加子集
        if (l != null && l.size() > 0) {
            for (PageData data : l) {
                getChlidList(data.getString(name),listAll,list,"parentId","initialId");
            }
        }
        list.addAll(l);
        return  list;
    }


    /**
     * 得到最顶级的节点
     * @return
     * @throws Exception
     */
    private List<PageData> getParent(List<PageData> listAll){
        List<PageData> l=new ArrayList<>();
        //循环得到有父节点的集合
        listAll.forEach(pageData -> {
            listAll.forEach(p -> {
                if(p.getString("parentId").equals(pageData.getString("id"))){
                    l.add(p);
                }
            });
        });
        //求差集
        listAll.removeAll(l);
        return listAll;
    }

    private List<PageData> getParent(List<PageData> listAll , String ParentName , String name){
        List<PageData> l = new ArrayList<>();
        //循环得到有父节点的集合
        listAll.forEach(pageData -> {
            listAll.forEach(p -> {
                if(p.getString(ParentName).equals(pageData.getString(name))){
                    l.add(p);
                }
            });
        });
        //求差集
        listAll.removeAll(l);
        return listAll;
    }

    public List<Tree> getTree (List<Tree> TreeNodes, String ParentName , String name) {
        TreeNodes.forEach(treeNode -> {
            if(treeNode.getParentId() != null ){
                TreeNodes.forEach(tree -> {
                    if(treeNode.getParentId().equals(tree.getCode())){
                        if(tree.getChildren() == null){
                            tree.setChildren(new ArrayList<Tree>());
                        }
                        tree.getChildren().add(treeNode);
                    }
                });
            }
        });
        //删除所有不为顶级目录的元素
        TreeNodes.removeIf(treeNode ->treeNode.getParentId() != null && !"0".equals(treeNode.getParentId()));
        return TreeNodes;
    }
    public List<Tree> getTree (List<Tree> TreeNodes) {
        TreeNodes.forEach(treeNode -> {
            if(treeNode.getParentId() != null ){
                TreeNodes.forEach(tree -> {
                    if(treeNode.getParentId().equals(tree.getId())){
                        if(tree.getChildren() == null){
                            tree.setChildren(new ArrayList<Tree>());
                        }
                        tree.getChildren().add(treeNode);
                    }
                });
            }
        });
        //删除所有不为顶级目录的元素
        TreeNodes.removeIf(treeNode ->treeNode.getParentId() != null && !"0".equals(treeNode.getParentId()));
        return TreeNodes;
    }
}
